package br.uniceub.fsw.agenda.model.facade;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.dao.UsuarioDAO;
import br.uniceub.fsw.agenda.model.vo.UsuarioVO;
import br.uniceub.fsw.agenda.model.dao.MenuDAO;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.util.StringUtils;
import java.util.List;

/**
 * 06/04/2008
 * @author Rodrigo Uchôa - rodrigo.uchoa@yahoo.com
 *
 */
public class ManterUsuarioFacade extends GenericFacade {
    
    /**
     * Busca todos os Menus
     * @return List com objetos Menu
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<MenuVO> findAllMenu() throws DatabaseException, BusinessException {
        try {
            MenuDAO dao = new MenuDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Verifica se login/senha do usuario estao corretos
     * @param login
     * @param senha
     * @return objeto Usuario correspondente
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public UsuarioVO fazerLogin(String login, String senha) throws BusinessException,
            DatabaseException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());
            return dao.findByLoginAndPassword(login, senha);
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todos os Usuários
     * @return List com objetos Usuario
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<UsuarioVO> findAllUsuario() throws DatabaseException, BusinessException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todos os Usuários ou somente aqueles que possuem parte do nome igual ao parametro passado
     * @return List com objetos Usuario
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<UsuarioVO> findAllUsuario(String noUsuario) throws DatabaseException, BusinessException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());
            
            if(StringUtils.isNullOrEmpty(noUsuario)) {
                dao.findAll();
            } else {
                dao.findAllByNome(noUsuario);
            }
            
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca a Usuario pela id
     * @param idUsuario id do Usuario
     * @return objeto Usuario
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public UsuarioVO findUsuarioById(Integer idUsuario) throws DatabaseException, BusinessException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());
            return dao.findById(idUsuario);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as Usuarios por parte do nome
     * @param noUsuario nome do usuario
     * @return List com objetos Usuario
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<UsuarioVO> findAllUsuarioByNome(String noUsuario) throws DatabaseException, BusinessException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());
            return dao.findAllByNome(noUsuario);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Insere um novo usuario.
     * @param usuario
     * @return ID auto-increment gerada pra esse registro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public Integer inserirUsuario(UsuarioVO usuario) throws BusinessException, DatabaseException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());

            //tratamento de erros
            String noUsuario = usuario.getNoUsuario();
            String dsLogin = usuario.getDsLogin();
            String dsSenha = usuario.getDsSenha();

            if(StringUtils.isNullOrEmpty(noUsuario))
            {
                throw new BusinessException("Nome do Usuario é obrigatório.");
            }
            if(StringUtils.isNullOrEmpty(dsLogin))
            {
                throw new BusinessException("Login do Usuario é obrigatório.");
            }
            if(StringUtils.isNullOrEmpty(dsSenha))
            {
                throw new BusinessException("Senha do Usuario é obrigatório.");
            }
        
            return dao.insert(usuario);
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Atualiza um usuario.
     * @param usuario
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void alterarUsuario(UsuarioVO usuario) throws BusinessException, DatabaseException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());

            //tratamento de erros
            String noUsuario = usuario.getNoUsuario();
            String dsLogin = usuario.getDsLogin();
            String dsSenha = usuario.getDsSenha();

            if(StringUtils.isNullOrEmpty(noUsuario))
            {
                throw new BusinessException("Nome do Usuario é obrigatório.");
            }
            if(StringUtils.isNullOrEmpty(dsLogin))
            {
                throw new BusinessException("Login do Usuario é obrigatório.");
            }
            if(StringUtils.isNullOrEmpty(dsSenha))
            {
                throw new BusinessException("Senha do Usuario é obrigatório.");
            }
        
            dao.update(usuario);            
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Exclui um usuario.
     * @param usuario
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void excluirUsuario(UsuarioVO usuario) throws BusinessException, DatabaseException {
        try {
            UsuarioDAO dao = new UsuarioDAO(getConnection());
            dao.delete(usuario);
        } finally {
            closeConnection();
        }        
    }

}
